'''
1.cookie的掌握
    解释：用来保持服务器和浏览器交互的状态，有服务器设置，存储在浏览器中
    作用：可以做网页的广告推送
    cookie的设置和获取：
        1.设置cookie：response.set_cookie(key,value,max_age)
        max_age 表示在cookie在浏览器的储存时间，单位是秒
        2.获取cookie：request.cookies.get("key")

2.session
    解释：服务器和用户做状态保持的，里面存储的是敏感信息(身份证，卡号，等等)，由服务器设置，并储存在服务器
    作用：用来做用户的登陆状态保持
    session的设置和获取
        设置session:session[key] = value
        获取session:value = session.get(key)
    注意：session的储存依赖于cookie
         储存在cookie中的sessionID需要加密，需要密钥（SECRET_KEY）

3.上下文
    解释：就是一个容器
    请求上下文：
        request：封装的是请求相关的数据
        session: 封装的是用户的敏感信息
    应用上下文（在项目中具体应用）
        current_app:是app的一个代理对象，可以通过它获取app身上设置的各种属性，主要用在模块化开发中
        g:一个局部的全局变量，主要用在装饰器中

4.Flask_script
    解释：属于flask扩展
    作用：用来动态运行程序，配合flask_migrate做数据迁移
    使用格式：
        导入：Manager类
        创建对象：manager,管理app
        使用manager启动程序
        启动命令：
            python xxx.py runserver -h(host是ip地址) -p(端口号) -d(调试模式)

5.render_template
    解释：属于jinja2的模板函数
    好处：
        以后的视图函数，只负责业务逻辑的处理，例如：数据库的 增 删 查 改
        以后数据的展示，全部由jinja2的模板负责
    使用格式
        response = render_template('模板文件')

6.获取变量
    {{变量}}

7.for循环和if语句
    语法都在file03programmer.html里面

8.字符串过滤器，upper,length,...
    语法{{字符 | 过滤语法}}
    链式调用：
    {{字符 | 过滤语法1 | 过滤语法2 | ...}}

9.自定义过滤器
    解释：当系统的过滤器满足不了需求的时候，需要自定义
    自定义过滤器有两种格式：
        1.先定义好函数，在将函数添加到系统的过滤器列表中
            def 函数名：pass
            app.add_template_filter(函数名，‘过滤器名字’)
        2.定义函数的时候，直接使用系统的过滤器进行装饰
        @app.template_filter('过滤名字')
        def 函数名字：
            pass

10.代码复用之继承：
    解释：相当于python中的函数，需要用的时候调用即可
    格式：
        {% macro 宏名(参数) %}
        {% endmacro %}
    使用格式：
        //使用当前函数定义好的宏
        {{ 宏名(参数) }}

        //使用其他文件定义好的宏
        {% import'文件' as 别名 %}
        {{ 别名.宏名() }}

11.代码复用之继承
    解释：一个子模版继承父模板
    作用：共性抽取，代码复用
    父模板：
        1.所有子类都具有的相同的内容，在父模板中直接写死
        2.每个子类的模板中不一样的内容，使用block模板定义好
    子模版：
        1.根据子类自己的需求，去重写父类中的block对应的内容
        2.如果重写之后，还想保留父类的内容，那么使用{{super()}}
        3.继承格式：{% extendx'父文件名' %}，写在页面的顶部
    注意：
        定义block的格式
        {% block 名称 %}
        {% endblock %}
13.代码复用之包含
    解释：在一个文件中完全拥有一个文件，不够灵活，没法扩展
    格式：
        方式一：{% include'文件' %}
        方式二：{% include'文件' ignore missing %}
    注意：
        ignore missing 如果包含的文件不存在，也不会报错，第一种会

14.模板特有的变量
    解释：不需要通过python程序中的app.config,表示应用程序中的所有配置信息
    request:表示请求上下文对象，封装的是请求相关的数据
    g:局部的全局变量
    url_for:反解析，通过函数的名字，解析到视图函数的路径
    get_flashed_message():用来 ‘ 消耗 ’ flash方法中储存的消息
        场景：登陆出错，可以显示
        注意点：
            1.使用flash存储消息的时候需要设置SECRET_KEY
            2.因为flash内部的消息存储，依赖于session

15.csrf攻击
    就是用你在浏览器中的cookie再去访问你之前访问过的网站，然后攻击你的账号

16.CSRFProtect解决csrf
    使用流程：
        安装扩展包：pip install flask_wtf
    导入包
        from flask_wtf.csrf import CSRFProtect
    1.创建CSRFProtect对象，保护app对象
    2.设置SECRET_KEY,便于csrf_token加密
    3.需要在表单中设置csrf_token即可
    注意：
        1.CSRFProtect一旦保护了app之后，会对‘post’,‘get’,‘dispatch’,‘delete’做校验


'''



































